<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .slide-enter-active,
        .slide-leave-active {
            transition: transform .5s;
        }

        .slide-enter {
            transform: translateX(1200px);
        }

        .slide-enter-to {
            transform: translateX(0px);
        }

        .slide-leave {
            transform: translateX(-1200px);
        }

        .slide-leave-to

        /* .fade-leave-active below version 2.1.8 */
            {
            transform: translateX(-1200px);
        }

        .container {
            position: relative;
            width: 1200px;
        }

        .view {
            position: absolute;
            left: 0;
            width: 1200px;
            background-color: #f1f1f1;
            border: 2px solid red;
            height: 400px;
        }
    </style>
</head>

<body>
    <div id="app">
        <router-link to="/">首页</router-link>
        <router-link to="/video/10001">视频</router-link>
        <router-link to="/video/10002">视频2</router-link>
        <router-link to="/music">音乐</router-link>
        <router-link to="/photo">美图</router-link>
        <router-link to="/mine">关于我</router-link>

        <!-- 5.设置一个路由展示容器  -->
        <div class="container">
            <transition name="slide">
                <router-view class="view"></router-view>
            </transition>
        </div>
    </div>

    <!-- 引入vue框架 开发版 :包含警告 和调试信息 -->
    <script src="../../lib/vue.js"></script>
    <script src="../../lib/vue-router.js"></script>
    <script>
        //    1.先为路由页面创建组件

        const Home = {
            template: `<div>这是首页</div>`
        }
        const Video = {
            template: `<div>这是视频</div>`,
            beforeRouteEnter(to,from,next){
                console.log(this);
                console.log("组件内部守卫：beforeRouterEngter",to,from,)
                next();
            },
            beforeRouteUpdate(to,from,next){
                console.log("组件内部守卫：befroeRouteUpdate",to,from,this)
                next();
            }

        }
        const Music = {
            template: `<div>这是音乐</div>`
        }
        const Photo = {
            template: `<div>这是美图</div>`
        }
        const Mine = {
            template: `<div>这是关于我</div>`
        }
        // 2.创建路由表(进行访问地址和组件的关联关系的表(映射))
        const routes = [
            {
                path: "/",
                component: Home
            },
            {
                path: "/video",
                component: Video,
                beforeEnter(to,from,next){//路由独享守卫：仅在当前路由中有效（路由进入之前）
                console.log('路由独享守卫',to,from)
                next();
                }
            },
            {
                path: "/music",
                component: Music
            },
            {
                path: "/photo",
                component: Photo
            },
            {
                path: "/mine",
                component: Mine
            },
        ];
        //3.创建vue 路由对象
        const router = new VueRouter({
            mode: "hash", //设置使用路由的模式 : hash(默认) / history / abstract (node.js环境中) 
            routes,// 配置当前路由实例的路由表
            fallback: true, //当浏览器不支持 history 模式控制路由是否应该回退到 hash 模式

        })
        /****************************** 全局 : 所有的路由都会生效)路由守卫钩子 **************************/
        //[配置一个] 全局前置守卫钩子 (在访问一个路由之前触发的钩子函数)
        router.beforeEach((to, from, next) => {//to 即将要进入到的路由对象
            console.log('路由前置钩子', to, from)
            next();
        })
        //后置钩子: 就是在路由导航跳转完毕后(新路由组件渲染完)触发一个钩子函数
        router.afterEach((to, from, next) => {
            console.log('路由后置钩子',to,from)

        })

        //vm 就是根组件
        let vm = new Vue({
            el: "#app",//指定Vue挂载的DOM
            data: {//当前vue实例中使用的数据

            },
            router,// 4. 将vue路由对象挂载到对应的vue实例对象
            methods: {//当前Vue实例中使用到的方法

            }
        })
    </script>
</body>

</html>